var name = 'window';
function Person(name) {
    this.name = name;
    this.foo1 = function(){
        console.log(this.name);
    }
    this.foo2 = () => console.log(this.name)
    this.foo3 = function() {
        return function() {
            console.log(this.name)
        }
    }
    this.foo4 = function() {
        return ()=> {
            console.log(this.name)
        }
    }
}
var person1 = new Person('person');
var person2 = new Person('person2');

person1.foo1(); // person
person1.foo1.call(person2); // person2;

person1.foo2(); // person 我做错了
person1.foo2.call(person2); // person  我做错了

person1.foo3()() // window
person1.foo3.call(person2)(); // window
person1.foo3().call(person2); // person2

person1.foo4()(); // person
person1.foo4.call(person2)(); //person2
person1.foo4().call(person2); // person

// person1.foo2();
// 实例有this，在1.1中的对象属性没有this。
// person1.foo2.call(person2);
// 箭头函数中，call apply bind 不起作用，它们取的是离他们最近的this
